package com.hsyt.pfc.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Description: redis hash表 操作接口
 * @ClassName: RedisHashHandler
 * @Package: com.hsyt.pfc.redis.hash
 * @Author: wangze@hsyuntai.com
 * @Date: 2018/8/10 11:43
 * @Copyright: 版权归 HSYUNTAI 所有
 */
@Component
public class RedisHashHandler {

    @Autowired
    private StringRedisTemplate redisTemplate;

    private static StringRedisTemplate stringRedisTemplate;

    @PostConstruct
    private void init() {
        stringRedisTemplate = this.redisTemplate;
    }

    public StringRedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * @Description: Hash（哈希表） ： 将哈希表 key 中的域 field 的值设为 value 。
     * 								如果 key 不存在，一个新的哈希表被创建并进行 HSET 操作
     * 								如果域 field 已经存在于哈希表中，旧值将被覆盖。
     * @param key
     * @param hashKey
     * @param value
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:06
     */
    public static void hSet(final String key,String hashKey,Object value){
        stringRedisTemplate.opsForHash().put(key, hashKey, value);
    }

    /**
     * @Description: Hash（哈希表） ： 返回哈希表 key 中给定域 field 的值。
     * @param key
     * @param field
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:27
     */
    public static Object hGet(final String key,String field){
        return stringRedisTemplate.opsForHash().get(key, field);
    }

    /**
     * @Description: Hash（哈希表） ： 同时将多个 field-value (域-值)对设置到哈希表 key 中。
     * 							      此命令会覆盖哈希表中已存在的域。
     * 							     如果 key 不存在，一个空哈希表被创建并执行 HMSET 操作。
     * @param key
     * @param map
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:19
     */
    public static void hMSet(final String key,Map<Object, Object> map){
        stringRedisTemplate.opsForHash().putAll(key, map);
    }

    /**
     * @Description: Hash（哈希表） ： 返回哈希表 key 中，一个或多个给定域的值。
     * 				 			如果给定的域不存在于哈希表，那么返回一个 nil 值。
     * @param key
     * @param fields
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月14日 下午2:49:39
     */
    public static List<Object> hMGet(final String key, Collection<Object> fields){
        return stringRedisTemplate.opsForHash().multiGet(key, fields);
    }

    /**
     * @Description: Hash（哈希表） ： 返回哈希表 key 中，所有的域和值。
     * 							   在返回值里，紧跟每个域名(field name)之后是域的值(value)，所以返回值的长度是哈希表大小的两倍。
     * @param key
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:34
     */
    public static Map<Object,Object> hGetAll(final String key){
        return stringRedisTemplate.opsForHash().entries(key);
    }

    /**
     * @Description: Hash（哈希表） ：  返回哈希表 key 中所有域的值。
     * @param key
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月14日 下午2:56:59
     */
    public static List<Object> hVals(final String key){
        return stringRedisTemplate.opsForHash().values(key);
    }

    /**
     * @Description: Hash（哈希表） ： 查看哈希表 key 中，给定域 field 是否存在。
     * @param key
     * @param field
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:43
     */
    public static boolean hExists(final String key,Object field){
        return stringRedisTemplate.opsForHash().hasKey(key, field);
    }

    /**
     * @Description: Hash（哈希表） ： 删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。
     * @param key
     * @param ojbKeys
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月13日 上午11:16:50
     */
    public static void hDel(final String key,Object... ojbKeys){
        stringRedisTemplate.opsForHash().delete(key, ojbKeys);
    }

    /**
     * @Description: Hash（哈希表） ：返回map的key集合Set
     * @Param:
     * @Return:
     * @Author: wangze@hsyuntai.com
     * @Date: 2018/6/1 13:56
     */
    public static Set<Object> hKeys(final String key){
        return stringRedisTemplate.opsForHash().keys(key);
    }

    /**
     * @Description: Hash（哈希表） ：  返回哈希表 key 中域的数量
     * @param key
     * @return
    * @Author: wangze@hsyuntai.com
     * @Date: 2015年11月14日 下午2:53:33
     */
    public static long hLen(final String key){
        return stringRedisTemplate.opsForHash().size(key);
    }


}
